package com.xuecheng.auth.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices;
import org.springframework.security.oauth2.provider.token.DefaultTokenServices;
import org.springframework.security.oauth2.provider.token.TokenEnhancerChain;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;

import java.util.Arrays;

/**
 * @author Administrator
 **/
@Configuration
public class TokenConfig {
//    @Autowired
//    TokenStore tokenStore;
//
//    @Bean
//    public TokenStore tokenStore() {
//        //使用内存存储令牌（普通令牌）
//        return new InMemoryTokenStore();
//    }
//
//    //令牌管理服务
//    @Bean(name="authorizationServerTokenServicesCustom")
//    public AuthorizationServerTokenServices tokenService() {
//        DefaultTokenServices service=new DefaultTokenServices();
//        service.setSupportRefreshToken(true);//支持刷新令牌
//        service.setTokenStore(tokenStore);//令牌存储策略
//        service.setAccessTokenValiditySeconds(7200); // 令牌默认有效期2小时
//        service.setRefreshTokenValiditySeconds(259200); // 刷新令牌默认有效期3天
//        return service;
//    }
//todo 苍穹外卖中的jwt??
//  JWT令牌,Spring Security OAuth2 中配置 JWT 令牌的核心逻辑，主要实现了 JWT 令牌的生成、存储和管理功能
    private String SIGNING_KEY = "mq123";//密钥
    @Autowired
    TokenStore tokenStore;
    @Autowired
    private JwtAccessTokenConverter accessTokenConverter;
//令牌存储配置
    @Bean//配置了JWT令牌存储策略，使用JwtTokenStore作为令牌存储实现，它依赖于JwtAccessTokenConverter
    public TokenStore tokenStore() {//JwtTokenStore是TokenStore的子类
//        public JwtTokenStore(JwtAccessTokenConverter jwtTokenEnhancer)
        return new JwtTokenStore(accessTokenConverter());
    }

    @Bean//JWT令牌转换器作用:1.令牌的生成和解析2.使用指定的密钥对令牌进行签名3.确保令牌在传输过程中不被篡改
    public JwtAccessTokenConverter accessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setSigningKey(SIGNING_KEY);
        return converter;
    }

    //令牌管理服务, Spring Security OAuth2 授权服务器中令牌管理的核心配置，负责处理 access_token 和 refresh_token 的生成、存储、有效期管理等核心逻辑
    @Bean(name = "authorizationServerTokenServicesCustom")//该 Bean 需在授权服务器配置类中被引用（如通过 @EnableAuthorizationServer 标注的类），才能生效。
    public AuthorizationServerTokenServices tokenService() {
        DefaultTokenServices service = new DefaultTokenServices();
// 开启后，授权服务器在生成 access_token 时会同时生成 refresh_token。
//客户端可在 access_token 过期后，使用 refresh_token 重新获取新的 access_token（无需用户重新登录）
        service.setSupportRefreshToken(true);//支持刷新令牌
        service.setTokenStore(tokenStore);//令牌存储策略

//这里将 accessTokenConverter（JWT 转换器）加入链中，作用是：
//1.将普通令牌转换为 JWT 格式（包含用户信息、权限、有效期等）。
//2.使用签名密钥（SIGNING_KEY）对 JWT 进行签名，确保令牌不被篡改。
        TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
        tokenEnhancerChain.setTokenEnhancers(Arrays.asList(accessTokenConverter));
        service.setTokenEnhancer(tokenEnhancerChain);

        service.setAccessTokenValiditySeconds(7200); // 令牌默认有效期2小时
        service.setRefreshTokenValiditySeconds(259200); // 刷新令牌默认有效期3天
        return service;
    }

}
